#ifndef QINIUUPLOADER_H
#define QINIUUPLOADER_H

#include <QObject>
#include <QNetworkAccessManager>
#include <QNetworkReply>
#include <QFile>
#include <QCryptographicHash>
#include <QJsonDocument>
#include <QJsonObject>
#include <QUrl>
#include <QDateTime>
#include <QByteArray>
#include <QUrlQuery>
#include <QFileInfo>
#include <QHttpMultiPart>
#include <QMimeDatabase>
#include <QJsonDocument>
#include <QJsonObject>

/**
 * @brief 七牛云上传器类
 * 负责处理图片上传到七牛云的核心逻辑
 */
class QiniuUploader : public QObject
{
    Q_OBJECT
public:
    explicit QiniuUploader(QObject *parent = nullptr);
    ~QiniuUploader();

    /**
     * @brief 设置七牛云配置
     * @param accessKey 访问密钥
     * @param secretKey 私有密钥
     * @param bucket 存储空间名称
     * @param region 区域代码
     */
    void setConfig(const QString &accessKey, const QString &secretKey,
                   const QString &bucket, const QString &region);

    /**
     * @brief 上传文件到七牛云
     * @param filePath 本地文件路径
     * @param customKey 自定义文件名，为空则使用本地文件名
     */
    void uploadFile(const QString &filePath, const QString &customKey = QString());

signals:
    /**
     * @brief 上传进度信号
     * @param percent 进度百分比(0-100)
     */
    void uploadProgress(int percent);

    /**
     * @brief 上传成功信号
     * @param fileUrl 上传后的文件URL
     * @param key 文件在七牛云上的唯一标识符
     */
    void uploadSuccess(const QString &fileUrl, const QString &key);

    /**
     * @brief 上传失败信号
     * @param errorMsg 错误信息
     */
    void uploadFailed(const QString &errorMsg);

private:
    /**
     * @brief 生成上传凭证
     * @param bucket 存储空间名称
     * @param key 文件标识符
     * @return 上传凭证字符串
     */
    QString generateUploadToken(const QString &bucket, const QString &key);

    /**
     * @brief 计算HMAC-SHA1签名
     * @param key 密钥
     * @param data 待签名数据
     * @return 签名结果
     */
    QByteArray hmacSha1(const QByteArray &key, const QByteArray &data);

    /**
     * @brief 获取上传域名
     * @return 上传域名字符串
     */
    QString getUploadDomain() const;

    QNetworkAccessManager *m_networkManager;
    QString m_accessKey;
    QString m_secretKey;
    QString m_bucket;
    QString m_region;
};

#endif // QINIUUPLOADER_H
